package core.vec;

import core.iterfaces.Matrix;
import core.iterfaces.Vec;
import exception.NotSupportException;

import java.util.Arrays;

/**
 * 稠密矩阵的存储使用一维数组
 */
public class DenseVec implements Vec {
    /**
     * 数据存储结构，只能在构造函数中指定
     */
    private Double[] store;

    /**
     * 默认构造函数，指定0维数组
     */
    public DenseVec(){
        store = new Double[0];
    }

    /**
     * 构造一个长度为len，默认值为0.0的向量
     * @param len 向量的长度
     */
    public DenseVec(int len){
        store = new Double[len];
        Arrays.fill(store,0.0);
    }

    /**
     * 构造一个向量，向量中的值为数组store中的值
     * @param values 传入的数组参数
     * @param isCopy 表示是否使用传入的数据构建矩阵，true表示重新拷贝一份
     */
    public  DenseVec(Double[] values,boolean isCopy){
        if(isCopy) {
            this.store = new Double[values.length];
            System.arraycopy(values, 0, this.store, 0, values.length);
        }
        else{
            this.store = values;
        }
    }

    @Override
    public Vec zero() {
        DenseVec result = new DenseVec(this.store,true);
        Arrays.fill(result.store,0.0);
        return result;
    }

    @Override
    public Vec zero(int len) {
        return new DenseVec(len);
    }

    @Override
    public double get(int i) {
        return store[i];
    }

    @Override
    public void set(int i, double value) {
        store[i] = value;
    }

    @Override
    public int len() {
        return store.length;
    }

    @Override
    public Matrix outProduct(Vec other){
        return null;
    }
}
